package com.ruoyi.huanjing.tool;

import org.jfree.chart.renderer.PaintScale;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;

public class CustomColorMap implements PaintScale {

    private final double min;
    private final double max;
    private final List<Color> colors;

    public CustomColorMap(double min, double max, List<Color> colorStops) {
        this.min = min;
        this.max = max;
        // 确保至少有两个颜色用于渐变
        if (colorStops.size() < 2) {
            throw new IllegalArgumentException("颜色列表至少需要包含两个颜色");
        }
        this.colors = new ArrayList<>(colorStops);
    }

    @Override
    public Paint getPaint(double value) {
        // 手动实现归一化（替代MathUtils.normalize）
        double normalized;
        if (max <= min) {
            // 处理特殊情况：当最大值等于最小值时，使用中间色
            normalized = 0.5;
        } else {
            // 将值归一化到[0, 1]范围
            normalized = (value - min) / (max - min);
            // 限制在[0, 1]区间内
            normalized = Math.max(0.0, Math.min(1.0, normalized));
        }

        // 计算颜色索引
        int colorCount = colors.size();
        int index = (int) (normalized * (colorCount - 1));
        index = Math.min(index, colorCount - 2); // 确保不越界

        // 获取相邻的两个颜色
        Color color1 = colors.get(index);
        Color color2 = colors.get(index + 1);

        // 计算两个颜色之间的混合比例
        double fraction = normalized * (colorCount - 1) - index;

        // 混合颜色
        return blendColor(color1, color2, fraction);
    }

    /**
     * 混合两个颜色
     * @param c1 第一个颜色
     * @param c2 第二个颜色
     * @param fraction 混合比例（0.0-1.0，0表示全c1，1表示全c2）
     * @return 混合后的颜色
     */
    private Color blendColor(Color c1, Color c2, double fraction) {
        // 确保比例在有效范围
        fraction = Math.max(0.0, Math.min(1.0, fraction));
        
        // 计算RGB分量
        int r = (int) (c1.getRed() + fraction * (c2.getRed() - c1.getRed()));
        int g = (int) (c1.getGreen() + fraction * (c2.getGreen() - c1.getGreen()));
        int b = (int) (c1.getBlue() + fraction * (c2.getBlue() - c1.getBlue()));
        
        // 确保RGB值在0-255范围内
        r = Math.max(0, Math.min(255, r));
        g = Math.max(0, Math.min(255, g));
        b = Math.max(0, Math.min(255, b));
        
        return new Color(r, g, b);
    }

    @Override
    public double getLowerBound() {
        return min;
    }

    @Override
    public double getUpperBound() {
        return max;
    }
}
    